import redis


# redis 提供两个类 Redis 和 StrictRedis,
# StrictRedis 用于实现大部分官方的命令，
# Redis 是 StrictRedis 的子类，用于向后兼用旧版本。
class RedisUtil:

    # redis连接池
    redis_pool = ""
    # redis连接
    redis_connect = ''

    #
    def __init__(self, host='127.0.0.1', port=6379, db=0):
        self.redis_pool = redis.ConnectionPool(host=host, port=port, decode_responses=True)
        self.redis_connect = redis.Redis(connection_pool=self.redis_pool)


    pass


redisUtil = RedisUtil()

# redis连接池
rp = redisUtil.redis_pool
# redis连接
rc = redisUtil.redis_connect

pass
# 语法
# set(name, value, ex=None, px=None, nx=False, xx=False)
#
# 在Redis 中设置值，默认，不存在则创建，存在则修改。
#
# 参数：
#
# ex - 过期时间（秒）
# px - 过期时间（毫秒）
# nx - 如果设置为True，则只有name不存在时，当前set操作才执行
# xx - 如果设置为True，则只有name存在时，当前set操作才执行

# 插入成功返回True， 插入失败返回None
isSuccess = rc.set("name", "value", ex=5, nx=True)
print(isSuccess)
# 当name不存在时才插入， 成功返回True， 失败返回False
isSuccess = rc.setnx("name", 'value')
print(isSuccess)

# 设置值 和 过期时间，单位秒
isSuccess = rc.setex('name', 10, 'value')
print(isSuccess)

# 设置值 和 过期时间，单位毫秒
isSuccess = rc.psetex('name', 15000, 'value1')
print(isSuccess)


# 批量设置值
# isSuccess = rc.mset(k1="v1", k2="v2")
# print("批量设置结果：", isSuccess)
isSuccess = rc.mset({"k1": "v1", "k2": "v2", "k3": "v3"})
print("批量设置结果：", isSuccess)
kvs = ["k1", 'k2', 'k3']
isSuccess = rc.mget(kvs)
print("批量获取结果方式1，返回值的列表：", isSuccess)
isSuccess = rc.mget("k1", "k2", "k3")
print("批量获取结果方式2，返回值的列表：", isSuccess)


# 有key返回值，没有返回None
value = rc.get("name")
print("获取单个key的值：" + value)

# 设置新值并返回原来的值
value = rc.getset("name", "value")
print("设置新值并返回原来的值" + value)

# getrange(key, start, end)
# 获取子序列（根据字节获取，非字符）
#
# 参数：
#
# name - Redis 的 name
# start - 起始位置（字节）
# end - 结束位置（字节）
value = rc.getrange("name", 1, 3)
print(value)

# setrange(name, offset, value)
# 修改字符串内容，从指定字符串索引开始向后替换（新值太长时，则向后添加）
# 参数：
#
# offset - 字符串的索引，字节（一个汉字三个字节）
# value - 要设置的值
# 从下标3开始变成sss
rc.setrange('name', 3, "sss")
print(rc.get("name"))

